神经网络算法实现

import numpy as npy
def tanh(x):
    return npy.tanh(x)
def tanh_deriv(x):
    return  1.0-npy.tanh(x)**2
def logistic(x):
    return 1/(1+npy.exp(-x))
def logistic_deriv(x):
    return logistic(x)*(1-logistic(x))
class NeuralNetwork:
    # 初始化,layes表示的是一个list,eg[10,10,3]表示第一层10个神经元,第二层10个神经元,第三层3个神经元
    def __init__(self,layers,activation="tanh"):
        if(activation=="logistic"):
            self.activation=logistic
            self.activation_deriv=logistic_deriv
        elif(activation=="tanh"):
            self.activation=tanh
            self.activation_deriv=tanh_deriv
        self.weight=[]
        # 循环从1开始,相当于以第二层为基准,进行权重的初始化
        for i in range(1,len(layers)-1):
            # 对当前神经节点的前驱赋值
            self.weight.append((2*npy.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)
            self.weight.append((2*npy.random.random((layers[i]+1,layers[i+1]))-1)*0.25)
        # 训练函数   ,X矩阵,每行是一个实例 ,y是每个实例对应的结果,learning_rate 学习率
        # epochs,表示抽样的方法对神经网络进行更新的最大次数
    def fit(self,X,y,learning_rete=0.2,epochs=10000):
        X=npy.atleast_2d(X)
        temp=npy.ones([X.shape[0],X.shape[1]+1])
        temp[:,0:-1]=X
        X=temp
        y=npy.array(y)
        for k in range(epochs):
            i=npy.random.randint(X.shape[0])
            a=[X[i]]
            for l in range(len(self.weight)):
                a.append(self.activation(npy.dot(a[l],self.weight[l])))
            error=y[i]-a[-1]
            deltas=[error-self.activation_deriv(a[-1])]
        # 开始反向计算误差,更新权重
        for l in range(len(a)-2,0,-1):
            deltas.append(deltas[-l].dot(self.weight[l].T)*self.activation_deriv(a[l]))
        deltas.reverse()
        for i in range(len(self.weight)):
            layer=npy.atleast_2d(a[i])
            delta=npy.atleast_2d(deltas[i])
            self.weight[i]+=learning_rete*layer.T.dot(delta)
    # 预测函数
    def predict(self,x):
        x=npy.array(x)
        temp=npy.ones(x.shape[0]+1)
        temp[0:-1]=x
        a=temp
        for l in range(0,len(self.weight)):
            a=self.activation(npy.dot(a,self.weight[l]))
        return a
x=npy.array([[0,0],[0,1],[1,0],[1,1]])
y=npy.array([1,0,0,1])
nn=NeuralNetwork([2,2,1],"tanh")
nn.fit(x,y)
for i in x:
    print(i,nn.predict(i))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值